package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import controle.FluidoControle;
import controle.CondicaoTesteControle;

import modelo.Cliente;
import modelo.CriterioAceitacao;
import modelo.EnumNorma;

public class CriterioAceitacaoDao {
	
	private Connection conexao;
	private FluidoControle ctrlFluido = new FluidoControle();
	private CondicaoTesteControle ctrlCondicaoTeste = new CondicaoTesteControle();	
	
	
	public CriterioAceitacaoDao(Connection con) throws ClassNotFoundException {
		this.conexao = con;		
	}
	
	public CriterioAceitacao getCriterioAceitacao(int codigo) {		
		CriterioAceitacao ca = null;		
		PreparedStatement stm = null;
		try {			
			stm = conexao.prepareStatement("select * from criterio_aceitacao " +  
										   "where codigo = ?");
			stm.setInt(1, codigo);			
			ResultSet rs = stm.executeQuery();
			while (rs.next()) {
				ca = setDados(rs);
			}						
		} catch (SQLException sqlEx) {
			sqlEx.printStackTrace();
		}
		return ca;		
	}
	/*--------CONTINUAR AQUI
	 *	
	public int gravarCriterioAceitacao(CriterioAceitacao criterioAceitacao) {		
		PreparedStatement stm = null;
		try {			
			if (criterioAceitacao.getCdCriterioAceitacao() == 0) {
				criterioAceitacao.getCondicaoTeste().setCdCondicaoTeste(ctrlCondicaoTeste.insertCondicaoTeste(criterioAceitacao.getCondicaoTeste()));
				stm = conexao.prepareStatement("insert into criterio_aceitacao(fluido,condicao_teste,tipoBomba,classe,pressaoAceitacao,rotacaoAceitacao,temperaturaSuperficie,temperaturaFluido,eficienciaMinima,eficienciaMaxima,norma)" + 
						                       "values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");			
			}
			stm.setInt(1, ctrlFluido.getCodigoFluido(criterioAceitacao.getFluido()));			
			stm.setInt(2, ctrlCondicaoTeste.);			
			stm.setString(3, ferramenta.getObservacao());
			stm.executeUpdate();
			stm.close();				
		} catch (SQLException e){
			e.printStackTrace();
		}
		return ferramenta;		
	}
	*/
	public CriterioAceitacao getCriterioAceitacao(CriterioAceitacao ca) {
		CriterioAceitacao criterioAceitacao = null;		
		PreparedStatement stm = null;
		try {
			stm = conexao.prepareStatement("select * from criterio_aceitacao, fluido " +    
		                                   "where criterio_aceitacao.fluido = fluido.codigo " + 
					                       "and criterio_aceitacao.fluido = (select codigo from fluido where fluido.nome = ? ) " +
		                                   "and criterio_aceitacao.tipoBomba = ?" +
		                                   "and criterio_aceitacao.classe = ? " +
		                                   "and criterio_aceitacao.norma = ?");
			stm.setString(1, ca.getFluido().getDsFluido());
			stm.setString(2, ca.gettipoTubo());
			stm.setString(3, ca.getDsClasseTemperatura());
			stm.setString(4, ca.getNorma().name());			
			ResultSet rs = stm.executeQuery();
			while (rs.next()) {
				ca = setDados(rs);											
			}						
		} catch (SQLException sqlEx) {
			sqlEx.printStackTrace();
		}
		return ca;
	}
	
	public List<CriterioAceitacao> getCriterioAceitacao(String fluido, EnumNorma norma) {
		CriterioAceitacao ca = null;
		List<CriterioAceitacao> listaCriterioAceitacao = null;
		PreparedStatement stm = null;
		try {
			stm = conexao.prepareStatement("select * from criterio_aceitacao, fluido " +    
		                                   "where criterio_aceitacao.fluido = fluido.codigo " + 
					                       "and criterio_aceitacao.fluido = (select codigo from fluido where fluido.nome = ? ) " +
		                                   "and criterio_aceitacao.norma = ?");
			stm.setString(1, fluido);
			stm.setString(2, norma.name());
			ResultSet rs = stm.executeQuery();
			while (rs.next()) {
				ca = setDados(rs);
				if(!(ca == null) ) {
					if(listaCriterioAceitacao == null) {
						listaCriterioAceitacao = new ArrayList<CriterioAceitacao>();
					}
					listaCriterioAceitacao.add(ca);
				}							
			}						
		} catch (SQLException sqlEx) {
			sqlEx.printStackTrace();
		}
		return listaCriterioAceitacao;
	}
	
	public List<String> getClasseTemperatura(EnumNorma norma) {
		String classe = null;
		List<String> listaClasseTemperatura = null;
		PreparedStatement stm = null;
		try {
			stm = conexao.prepareStatement("select distinct classe from criterio_aceitacao " +    
		                                   "where criterio_aceitacao.norma = ?");
			stm.setString(1, norma.name());			
			ResultSet rs = stm.executeQuery();
			while (rs.next()) {
				classe = rs.getString("classe");
				if(!(classe == null) ) {
					if(listaClasseTemperatura == null) {
						listaClasseTemperatura = new ArrayList<String>();
					}
					listaClasseTemperatura.add(classe);
				}							
			}						
		} catch (SQLException sqlEx) {
			sqlEx.printStackTrace();
		}
		return listaClasseTemperatura;
	}
	
	private CriterioAceitacao setDados(ResultSet rs) throws SQLException{
		CriterioAceitacao ca = new CriterioAceitacao();
		ca.setCdCriterioAceitacao(rs.getInt("codigo"));
		ca.setTipoTubo(rs.getString("tipoBomba"));
		ca.setDsClasseTemperatura(rs.getString("classe"));
		ca.setPressao(rs.getInt("pressaoAceitacao"));
		ca.setRotacao(rs.getInt("rotacaoAceitacao"));
		ca.setTemperaturaSupEstator(rs.getInt("temperaturaSuperficie"));
		ca.setTemperaturaFluido(rs.getInt("temperaturaFluido"));
		ca.setEficienciaVolMin(rs.getInt("eficienciaMinima"));
		ca.setEficienciaVolMax(rs.getInt("eficienciaMaxima"));		
		if(rs.getString("norma").equalsIgnoreCase(EnumNorma.NDB147.name())) {
			ca.setNorma(EnumNorma.valueOf(EnumNorma.NDB147.name()));		
		} else {
			if(rs.getString("norma").equalsIgnoreCase(EnumNorma.N2506.name())) {
				ca.setNorma(EnumNorma.valueOf(EnumNorma.N2506.name()));
			}
		}		
		ca.setFluido(ctrlFluido.getFluido(rs.getInt("fluido")));
		ca.setCondicaoTeste(ctrlCondicaoTeste.getCondicaoTeste(rs.getInt("condicao_teste")));
		return ca;		
	}

}
